﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SegIdenMovil.Entidad;
using GS1.Library;
using SegIdenMovil.Herramientas;
using SegIdenMovil.Delegate;

namespace SegIdenMovil
{
    public partial class frmMantenimiento : Form
    {
        #region --- Variables y Constantes ---
        private Proveedor proveedorSeleccionado = null;
        #endregion

        #region --- Constructor ---
        public frmMantenimiento()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmMantenimiento_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void mnuContinuar_Click(object sender, EventArgs e)
        {
            continuar();
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            elegirProveedor();
        }

        private void txtProveedorNumero_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { buscarProveedor(); }
        }

        private void txtProveedorNumero_TextChanged(object sender, EventArgs e)
        {
            limpiarDatosProveedor();
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                // Mostrar descripcion de tienda
                this.lblEtiquetaTienda.Text = ParametrosAplicacion.TIENDA_ACTUAL.descripcion;
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void elegirProveedor()
        {
            using (frmListado frmListado = new frmListado())
            {
                frmListado.TipoListado = frmListado.TipoLista.PROVEEDOR;
                if (frmListado.ShowDialog() == DialogResult.Cancel) { frmListado.Dispose();  return; }

                this.proveedorSeleccionado = (Proveedor)frmListado.ItemSeleccionado;
                this.txtProveedorNumero.Text = this.proveedorSeleccionado.identificacion;
                this.txtProveedorRazonSocial.Text = this.proveedorSeleccionado.razonSocial;
                frmListado.Dispose(); 
            }
        }

        private bool validarEntradaBusqueda()
        {
            this.txtProveedorNumero.Text = this.txtProveedorNumero.Text.Trim();

            if (this.txtProveedorNumero.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtProveedorNumero, "Debes ingresa el número de identificación", this.Text);
                return true;
            }

            if (this.txtProveedorNumero.TextLength < 3)
            {
                Util.CampoNecesario(this.txtProveedorNumero, "Debe ingresar por lo menos 3 caracteres para realizar la busqueda", this.Text);
                return true;
            }

            return false;
        }

        private void buscarProveedor()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntradaBusqueda()) { return; }

                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_PROVEEDOR_PORIDENTIFICACION;

                operacion.proveedor = new Proveedor();
                operacion.proveedor.identificacion = this.txtProveedorNumero.Text;

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de Proveedor
                Proveedor proveedor = contenidoXML.DeserializarTo<Proveedor>();

                // Limpiando datos del proveedor anterior
                limpiarDatosProveedor();

                // Si el cliente existe
                if (proveedor != null)
                {
                    if (proveedor.estado.Equals(Constantes.ESTADO_CODIGO_INACTIVO))
                    {
                        Util.ShowMessageboxExclamacion("Este proveedor se encuentra en estado inactivo", this.Text);
                        return;
                    }

                    // Establecer su razon social
                    this.proveedorSeleccionado = proveedor;
                    this.txtProveedorRazonSocial.Text = proveedorSeleccionado.razonSocial;
                }
                else
                {
                    Util.ShowMessageboxExclamacion("El proveedor buscado no existe", this.Text);
                    return;
                }
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarEntrada()
        {
            this.txtProveedorRazonSocial.Text = this.txtProveedorRazonSocial.Text.Trim();

            if (this.txtProveedorRazonSocial.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtProveedorRazonSocial, "Debes seleccionar o buscar el proveedor", this.Text);
                return true;
            }

            return false;
        }

        private void continuar()
        {
            Mantenimiento mantenimiento = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                if (validarEntrada()) { return; }

                mantenimiento = new Mantenimiento();

                // Estableciendo proveedor
                mantenimiento.proveedor = new Proveedor();
                mantenimiento.proveedor.codProveedor = this.proveedorSeleccionado.codProveedor;

                // Estableciendo usuario de registro
                mantenimiento.usuario = new Usuario();
                mantenimiento.usuario.codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario;

                // Estableciendo estado y fecha
                mantenimiento.estado = Constantes.ESTADO_DOCUMENTO_PENDIENTE;
                mantenimiento.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                using (frmMantenimientoDetalle frmMantenimientoDetalle = new frmMantenimientoDetalle())
                {
                    frmMantenimientoDetalle.mantenimiento = mantenimiento;
                    
                    if (frmMantenimientoDetalle.ShowDialog() == DialogResult.Cancel) { frmMantenimientoDetalle.Dispose(); return; }
                    
                    frmMantenimientoDetalle.Dispose();
                    salir();
                }
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void limpiarDatosProveedor()
        {
            // Limpiando datos del proveedor anterior
            this.txtProveedorRazonSocial.Text = string.Empty;
        }

        private void salir()
        {
            this.Close();
        }
        #endregion
    }
}